/**
 * 一、Set
   Set 对象允许你存储任何类型的唯一值，无论是原始值或者是对象引用。
 实例方法
    Set.prototype.add(value)
       在Set对象尾部添加一个元素。返回该Set对象。
    Set.prototype.clear()
       移除Set对象内的所有元素。
    Set.prototype.delete(value)
       移除Set中与这个值相等的元素，返回Set.prototype.has(value)在这个操作前会返回的值（即如果该元素存在，返回true，否则返回false）。
       Set.prototype.has(value)在此后会返回false。
    Set.prototype.entries()
       返回一个新的迭代器对象，该对象包含Set对象中的按插入顺序排列的所有元素的值的[value, value]数组。
       为了使这个方法和Map对象保持相似， 每个值的键和值相等。
    Set.prototype.forEach(callbackFn[, thisArg])
       按照插入顺序，为Set对象中的每一个值调用一次callBackFn。如果提供了thisArg参数，回调中的this会是这个参数。
    Set.prototype.has(value)
       返回一个布尔值，表示该值在Set中存在与否。
    Set.prototype.keys() (en-US)
       与values()方法相同，返回一个新的迭代器对象，该对象包含Set对象中的按插入顺序排列的所有元素的值。
    Set.prototype.values()
       返回一个新的迭代器对象，该对象包含Set对象中的按插入顺序排列的所有元素的值。
    Set.prototype[@@iterator]()
       返回一个新的迭代器对象，该对象包含Set对象中的按插入顺序排列的所有元素的值。

* 二、WeakSet
       WeakSet 对象允许你将弱保持对象存储在一个集合中。
    方法
        WeakSet.prototype.add()
        WeakSet.prototype.delete()
        WeakSet.prototype.has()

    描述
      WeakSet 对象是一些对象值的集合, 并且其中的每个对象值都只能出现一次。在WeakSet的集合中是唯一的

    它和 Set 对象的区别有两点:

       1、与Set相比，WeakSet 只能是对象的集合，而不能是任何类型的任意值。
       2、WeakSet持弱引用：集合中对象的引用为弱引用。 
          如果没有其他的对WeakSet中对象的引用，那么这些对象会被当成垃圾回收掉。
          这也意味着WeakSet中没有存储当前对象的列表。 正因为这样，WeakSet 是不可枚举的。    
 */

 const arr = [1,2,1,3,1,4,1,1,1,1,1]      
 
 const set = new Set(arr)  

 console.log("set:",set) //Set(4) {1, 2, 3, 4},会改变原数组

 //const array = [1,1,1,1,2,3,4,2,4] //weakMap不能用数组，只能用对象
 //const weakSet = new WeakSet(array)
 //console.log("weakset:",weakSet) //报错

 const obj = {}

 const weakSet = new WeakSet()
 //weakSet.set(obj,"name")
 weakSet.add({},"name")

 console.log(weakSet)